package asem.ast.sentencias;

import genc.GenC;
import alex.Token;
import asem.ast.expresiones.NodoExpresion;
import asem.excepciones.ExcepcionTiposIncompatibles;
import asem.tablaSimbolos.tipo.Tipo;
import asem.tablaSimbolos.tipo.TipoBoolean;

public class NodoIf extends NodoSentencia {
	protected static int cantIfs = 0;

	protected Token _if;
	protected NodoExpresion condicion;
	protected NodoSentencia sentencia;

	public NodoIf(Token i, NodoExpresion exp, NodoSentencia s) {
		_if = i;
		condicion = exp;
		sentencia = s;
	}

	public boolean chequeoSentencias(NodoBloque contenedor) {

		String label = "fin_IF_" + cantIfs;
		cantIfs++;

		Tipo tipoCondicion = (Tipo) condicion.chequeoSentencias(contenedor);
		// En el tope de la pila me va a quedar la condicion.

		GenC.gen.saltoSiFalso(label,
				"Salto al final del if si la condicion es falsa");

		if (!tipoCondicion.compatible(TipoBoolean.TIPO))
			throw new ExcepcionTiposIncompatibles(tipoCondicion, _if);

		boolean retu = sentencia.chequeoSentencias(contenedor);

		GenC.gen.nop(label, "Final del bloque if");

		return retu;
	}

}
